www.gusucode.com > VC编写的串口调试软件 > VC编写的串口调试软件,内含Modbus协议类 支持对Modbus通讯调试/Modbus串口调试软件1.0/DlgModbus.cpp

    // DlgModbus.cpp : implementation file
//

#include "stdafx.h"
#include "ModbusRTU.h"
#include "DlgModbus.h"

#include "ModBus.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDlgModbus dialog


CDlgModbus::CDlgModbus(CWnd* pParent /*=NULL*/)
	: CDialog(CDlgModbus::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDlgModbus)
	m_unRegAddress = 0;
	m_unRegCount = 1;
	m_unStation = 1;
	m_strRegType = _T(" 3");
	m_bFrameMode = MODBUS_RTU;
	//}}AFX_DATA_INIT
}


void CDlgModbus::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgModbus)
	DDX_Text(pDX, IDC_EDIT_ADDRESS, m_unRegAddress);
	DDX_Text(pDX, IDC_EDIT_COUNT, m_unRegCount);
	DDX_Text(pDX, IDC_EDIT_STATTIONNUM, m_unStation);
	DDX_CBString(pDX, IDC_COMBO_FUNCTION, m_strRegType);
	DDX_Radio(pDX, IDC_CHECK01, m_bFrameMode);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDlgModbus, CDialog)
	//{{AFX_MSG_MAP(CDlgModbus)
	ON_WM_DESTROY()
	ON_CBN_SELCHANGE(IDC_COMBO_FUNCTION, OnSelchangeComboFunction)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgModbus message handlers

void CDlgModbus::OnDestroy() 
{
	CDialog::OnDestroy();
	
	// TODO: Add your message handler code here
	delete this;
	
}

int CDlgModbus::GetSendTxt(unsigned char * pucSendTxt)
{
	CEdit* pEdit;
	CString strtxt;

	//站号
	pEdit =(CEdit*)GetDlgItem(IDC_EDIT_STATTIONNUM);
	pEdit->GetWindowText (strtxt);
	strtxt.Trim();
	if(strtxt.IsEmpty ())
		return -1;
	
	//地址
	pEdit =(CEdit*)GetDlgItem(IDC_EDIT_ADDRESS);
	pEdit->GetWindowText (strtxt);
	strtxt.Trim();
	if(strtxt.IsEmpty ())
		return -1;

	//数量
	pEdit =(CEdit*)GetDlgItem(IDC_EDIT_COUNT);
	pEdit->GetWindowText (strtxt);
	strtxt.Trim();
	if(strtxt.IsEmpty ())
		return -1;
	

   UpdateData(TRUE);


	CString strText;

	CComData cComData;
	cComData.m_unStationNum =m_unStation;
	cComData.m_unRegType=atoi(m_strRegType);
	cComData.m_unRegAddr =m_unRegAddress;
	
	if(cComData.m_unRegType==5)
	{
		cComData.m_unRegCount=1;
		if(m_unRegCount>0)
		cComData.m_strRegValue="1";
	}
	else if(cComData.m_unRegType==6)
	{
		cComData.m_unRegCount=1;
		cComData.m_strRegValue.Format ("%d",m_unRegCount);
	}
	else
		cComData.m_unRegCount=m_unRegCount;
	

	CString strSendTxt;
	unsigned int unCount=0;
	CModBus cModBus;
	if(MODBUS_RTU==m_bFrameMode)
	{
		cModBus.SetFrameMode(CModBus::MODBUS_RTU);
		cModBus.Decoding(cComData);
		//
		unCount=cComData.m_unDataLen;

		CString strTxt;
		unsigned int unIndex;
		for(unIndex=0;unIndex<unCount;unIndex++)
		{
			pucSendTxt[unIndex]=cComData.m_ucProtocalTxt[unIndex] ;

			unsigned char ucByteH=pucSendTxt[unIndex]>>4;
			unsigned char ucByteL=pucSendTxt[unIndex]&0x0F;
			
			if(ucByteH>=0xA)
				strTxt.Format ("0x%c",char(ucByteH-0x0A+'A'));
			else
				strTxt.Format ("0x%c",char(ucByteH+'0'));

			if(ucByteL>=0xA)
				strTxt+=char(ucByteL-0x0A+'A');
			else
				strTxt+=char(ucByteL+'0');
			strTxt+=" ";

			strSendTxt+=strTxt;

		}
	}
	else
	{	//MODBUS_ASCII
		cModBus.SetFrameMode(CModBus::MODBUS_ASCII);
		cModBus.Decoding(cComData);
		//
		unCount=cComData.m_unDataLen;
		unsigned int unIndex;
		for(unIndex=0;unIndex<unCount;unIndex++)
		{
			pucSendTxt[unIndex]=cComData.m_ucProtocalTxt[unIndex] ;
		}

		cComData.m_ucProtocalTxt[unCount]='\0';
		strSendTxt=cComData.m_ucProtocalTxt;
	}

	CWnd* pWnd=GetDlgItem(IDC_EDIT_SEND);
	if(pWnd)
		pWnd->SetWindowText(strSendTxt);

	return unCount ;
}

void CDlgModbus::OnCancel() 
{
	// TODO: Add extra cleanup here
	
//	CDialog::OnCancel();
}

void CDlgModbus::OnOK() 
{
	// TODO: Add extra validation here
	
//	CDialog::OnOK();
}

void CDlgModbus::OnSelchangeComboFunction() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	CWnd* pWnd=GetDlgItem(IDC_STATIC_TIP);
	if(atoi(m_strRegType)==5
	 ||atoi(m_strRegType)==6)
	{
		pWnd->SetWindowText ("写入值");
	}
	else
		pWnd->SetWindowText ("数量");

}